<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.global.js"></script>
</head>
<body>
    <div id="app">
        <p ref="p">{{count}}</p>
        <p>
            <button @click="count++">count++</button>
        </p>
        <hr>
        <p>
            {{zhang.name}}----{{zhang.age}}---{{zhang.info.height}}
        </p>
        <p>
            <button @click="zhang.age++">age++</button>
            <br>
            <button @click="zhang.info.height++">height++</button>
            <br>
            <!-- 修改zhang.value -->
            <button @click="zhang = {
                name:'李四',
                age:22,
                info:{
                    height:177,
                    weight:70
                }
            }">重置</button>
        </p>
    </div>
</body>
<script>
    let {createApp,nextTick} = Vue;
    let {ref,reactive,readonly,computed,watch} = Vue;
    let {shallowRef,shallowReactive} = Vue;

    // ref() 的浅层作用形式。
    // 和 ref() 不同，浅层 ref 的内部值将会原样存储和暴露，并且不会被深层递归地转为响应式。只有对 .value 的访问是响应式的。


    var app = createApp({
        
        setup(props) {

            // ref()  一般创建对值类型的引用, 也可以创建对对象(引用类型)的引用
            //  ref() 让我们能创造一种对任意值的 “引用”，并能够在不丢失响应性的前提下传递这些引用。
            // 方法返回一个ref对象, 对象中存在value属性(取值拦截和赋值拦截)存储传入数据,监听到value属性值发生改变,更新视图
            // 如果ref.value值是一个对象 ->  无论ref.value发生改变(修改整个对象),还是ref.value下的对象的属性发生改变 => 都会触发视图更新  (数据监听默认是深度的)


            let count = ref(100);
            let addCount = ()=>{
                count.value ++;
            }

            // zhang -> ref对象  
            // let zhang = ref({// 目标对象
            //     name:"张三",
            //     age:18,
            //     info:{
            //         height:173,
            //         weight:65
            //     }
            // });  

            // shallowRef() 只监听 ref对象.value改变, 不监听value下的数据更改
            let zhang = shallowRef({
                name:"张三",
                age:18,
                info:{
                    height:173,
                    weight:65
                }
            });  




          

            
            






            


            return {
                // 键名: 传递出去的数据名 方法名  计算属性
                count:count,
                addCount,
                zhang,
            }
            
        },
        mounted() {
            // console.log("this",this);
        },
        watch:{
            // "zhang":function(){},
            // "zhang.age":function(){},
        }
        
    })

    app.mount("#app");








</script>
</html>